package Demo2;

import java.util.Arrays;
//顺序表，低层是个数组
public class MyArrayList {
    public int[] elem;
    public int usedSize;//已经存储了多少个数据
    public static final int DEFAULT_SIZE=10;
    //初始化数组
    public MyArrayList(){
        this.elem=new int[DEFAULT_SIZE];
    }
    //打印顺序表
    public void display(){
        for (int i = 0; i < this.usedSize; i++) {
            System.out.println(this.elem[i]+" ");
        }
    }
    //获取顺序表长度
    public int size(){
        return this.usedSize;
    }
    //判断是否包含某个元素
    public boolean contains(int tofind){
        for (int i = 0; i < this.usedSize; i++) {
            if(this.elem[i]==tofind){
                return true;
            }
        }
        return false;
    }
    //查找某个元素对应位置，返回下标
    public int indexOF(int tofind){
        for (int i = 0; i < this.usedSize; i++) {
            if(this.elem[i]==tofind){
                return i;
            }
        }
        return -1;
    }
    //新增元素,默认放最后一个位置
    public void add(int data){
        //如果满了，扩容
        resize();//满了扩容
        this.elem[this.usedSize]=data;
        this.usedSize++;
    }
    //在pos位置新增元素
    public void add(int pos,int data){
        checkIndex(pos);//检查pos位置
        //判断是否满了
        resize();//满了扩容

        //先腾出位置，元素往后移动
        for (int i = usedSize-1; i >=pos ; i--) {
            elem[i+1]=elem[i];
        }
        //腾出位置后
        elem[pos]=data;
        usedSize++;
    }
    //检查pos是否合法
    private void checkIndex(int pos){
        if(pos<0||pos>usedSize){
            //throw抛出异常
            throw new IndexOutOfException("元素位置不合法");
        }
    }
    //获取pos位置的元素
    public int get(int pos){
        checkGetIndex(pos);
        return elem[pos];
    }
    private void checkGetIndex(int pos){
        if(pos<0||pos>=usedSize){
            //throw抛出异常
            throw new IndexOutOfException("Get获取元素时，位置不合法");
        }
    }
    //扩容
    private void resize(){
        if(isFull()){
            this.elem=Arrays.copyOf(this.elem,
                    2*this.elem.length);//elem指向新的数组对象，copyOf可以指定新的数组长度
        }
    }
    //如果数据满了
    public boolean isFull(){
        return this.usedSize==this.elem.length;
    }
    //给Pos位置设置新值，即更新
    public void set(int pos,int value){
        checkIndex(pos);
        elem[pos]=value;
    }
    //删除某个元素
    public boolean remove(int toRemove){
        int index=indexOF(toRemove);//返回查找的下标
        if(index==-1){
            System.out.println("没有这个数据");
            return false;
        }
        for (int i = index; i < usedSize-1; i++) {
            //若usedSize=6,如果i<usedSize设置为条件，当i=5时，elem[i=6]下标越界
            elem[i]=elem[i+1];
        }
        //覆盖前一个元素完成后，usedSize-1
        usedSize--;
        elem[usedSize]=0;//最后一个元素设置为0
        //elem[usedSize]=null;如果是引用类型
        return true;
    }
    //清空顺序表
    public void clear(){
        //如果该顺序表是引用类型
        /*for (int i = 0; i < usedSize; i++) {
            elem[i]=null;
        }
        usedSize=0;*/
        usedSize=0;
    }
}
